#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int len,list[4];
char c[10];

void menu(int *);

void print(int list[])
{
   int i;
   for(i=0;i<len;i++)
   {
     printf("%d\t",list[i]);
   }
   puts("");
} 

int check_index(int ind)
{
  if((ind<0)||(ind>=len))
  {
    printf("Error!!!\nINDEX not FOUND\n");
    return 0;
  }
  return 1;
}  
  
void sort(int list[])
{
  int i, j, temp ;
  for (i=0;i<len-1;i++)
  {
	 for(j=0;j<len-i-1;j++)
	 {
		if(list[j]>list[j+1])
		{
		  temp=list[j];
		  list[j]=list[j+1];
		  list[j+1]=temp;
		}
	 }
  }
  menu(list);
}//sort

void reverse(int list[])
{
  int i,j,temp;
  for(i=0,j=len-1;i<len/2;i++,j--)
  {
	 temp=list[i];
	 list[i]=list[j];
	 list[j]=temp;
  }
  menu(list);
}

int find_index(int list[],int x)
{
  int i;
  for(i=0;i<len;i++)
  {
	 if(list[i]==x)
		return i;
  }
  i=-1;
  return i;
}

void copy_arr(int new[],int old[])
{
  int i;
  for(i=0;i<len;i++)
    new[i]=old[i];

}  


void remove_element(int li[],int x)
{ 
  int list[len-1];
  int ind=find_index(li,x);
  int i;
  if(ind==-1)
  {
	 puts("NOT FOUND");
	 return;
	 //err_not_found();
  }
  else
  {
	 for(i=ind;i<len-1;i++)
	 {
		li[i]=li[i+1];
	 }
	 len--;
	 copy_arr(list,li);
	 menu(list);
  }
}


void insert(int li[],int ind,int x)
{
  int i,list[len+1];
  for(i=len-1;i!=ind-1;i--)
  {
	 li[i+1]=li[i];
  }
  li[ind]=x;
  len++;
  copy_arr(list,li);
  menu(list);
}

void append(int li[],int x)
{
  int list[len+1],i;
  copy_arr(list,li);
  //for(i=0;i<len;i++)
  //  list[i]=li[i];
  list[len]=x;
  len++;
  menu(list);
  
}

void extend(int li[],int b[],int l)
{
  int i,list[l+len];
  for(i=0;i<len;i++)
    list[i]=li[i];
  for(i=0;i<l;i++)
    list[i+len]=b[i];
  len=len+l;
  menu(list);
}  

void pop(int li[],int ind)
{
  int i,list[len-1];
  printf("%d\n",li[ind]);
  for(i=ind;i<len-1;i++)
  {
	 li[i]=li[i+1];
  }
  len--;
  copy_arr(list,li);
  menu(list);
}

int count(int list[],int x)
{
  int i,count=0;
  for(i=0;i<len;i++)
  {
	 if(list[i]==x)
		count++;
  }
  return count;
}

void slicing(int list[],int sind,int eind,int mult)
{
  int i,j;
  i=sind;
  while((i<eind)&&(i!=len-1))
  {
    printf("%d\t",list[i]);
    for(j=i;j<mult;j++)
    {
      if(j==len)
	return;
    }
    i+=mult;
  }
  puts("");
}
        
int search(int list[],int x)
{
  int i;
  for(i=0;i<len;i++)
  {
	 if(list[i]==x)
		return 1;
  }
  return 0;
}

void check_name(char str[],char ch)
{
  int i;
  if(strncmp(str,c,strlen(c))==0)
  {
    if(str[strlen(c)]==ch)
    {
      for(i=strlen(c)+1;i<strlen(str);i++)
      {
	str[i-strlen(c)-1]=str[i];
      }
      str[strlen(str)-strlen(c)-1]='\0';
    }
  }
  else
  {
    printf("\nERROR\n\n");
    //check(list);
  }
  
}

int get_num(char s[],int pos)
{
  int num,j,k;
  long val;    
  num=0;
  for(j=0;j<=pos;j++)
  {
    val=1;
    for(k=0;k<pos-j;k++)
    val=10*val;
    //val=(int)pow(10,(pos-j));
    num+=((int)s[j]-48)*val;
  }	
  return num;
}
  
void get_list(int list[],char str[])
{
  char s[100];
  int i,num,l=0,pos;
  for(i=0;i<strlen(str);i++)
  {
    if(((int)str[i]<=57)&&((int)str[i]>=48))
    {
      pos=-1;
      while(((int)str[i]<=57)&&((int)str[i]>=48))
      {
	pos++;
	s[pos]=str[i];
	i++;
      }
      num=get_num(s,pos);
      list[l]=num;
      l++;
    }
  }
}

void find_val(char str[],int len)
{
  char s[10]="";
  int i=0,pos,j,list[len],l=0,num;
  while(str[i]!='=')
  {  
    c[i]=str[i];
    i++;
  }  
  c[i]='\0';
  check_name(str,'=');
  get_list(list,str);
  menu(list);
}

int check_func_name(int li[],char str[],char s[])
{
  int i=0,no;
  if(strncmp(str,s,strlen(s))==0)
  {
    if(str[strlen(s)]=='(')
    {
      for(i=strlen(s)+1;i<strlen(str);i++)
        str[i-strlen(s)-1]=str[i];
      str[strlen(str)-strlen(s)-1]='\0';
      get_list(li,str);
      return 1;
    }
  }
  else
    return 0;
}

int check_len(char str[])
{
  int i,l=0;
  for(i=0;i<strlen(str);i++)
  {  
    if((char)str[i]==',')
    l++;
  }
  l++;
  return l;
}      


void err_message(int list[])
{
  puts("COMMAND NOT FOUND!!!CHECK SPELLING");
  menu(list);
} 

void check_errors(int list[],char str[],char ch1,char ch2)
{
  char flag='t';
  int i,j,k;
  for(i=0;i<strlen(str);i++)
  {
    if((((int)str[i]>=48)&&((int)str[i]<=57))||(str[i]=='(')||(str[i]==')')||(str[i]=='[')||(str[i]==']')||(str[i]==','))
    {
      if(str[i]==ch1)
      {
        for(j=i+1;j<strlen(str);j++)
        {
	  if(str[j]==ch1)
	  {
	    err_message(list);
	  }
	  else
	  if(str[j]==ch2)
	  {
	    for(k=j+1;k<strlen(str);k++)
	    {
	      if((str[k]==ch1)||(str[k]==ch2))
	      {
	        err_message(list);
	      }
	    }
	    flag='f';
	  }
        }
      }
    }
  }
  if(flag=='t')
  {
    err_message(list);
  }
}
 
void other(int list[],char str[],int l)
{
  int li[l],cnt,i;
  check_name(str,'.');
  if((check_func_name(li,str,"append"))&&(l==1))
  {
    append(list,li[0]); 
  }
  else
    if((check_func_name(li,str,"insert"))&&(l==2))
    {
      insert(list,li[0],li[1]);
    }
  else  
    if((check_func_name(li,str,"pop"))&&(l==1))
    {
      pop(list,li[0]); 
    }
  else  
    if((check_func_name(li,str,"reverse"))&&(l==1))
    {
      reverse(list); 
    }
  else
    if((check_func_name(li,str,"count"))&&(l==1))
    {
      cnt=count(list,li[0]);
      printf("%d\n",cnt);
      menu(list);
    }
  else
    if((check_func_name(li,str,"remove"))&&(l==1))
    {
      remove_element(list,li[0]);
    }
  else
    if((check_func_name(li,str,"sort"))&&(l==1))
    {
      sort(list);
    }
  else
    if((check_func_name(li,str,"index"))&&(l==1))
    {
      cnt=find_index(list,li[0]);
      printf("%d\n",cnt);
      menu(list);
    }
  else
    if(check_func_name(li,str,"extend"))
    {
      extend(list,li,l); 
    }
  else
  {
    puts("ERROR!!!CHECK FUNCTION NAME OR NUMBER OF PARAMETERS");
    menu(list);
  }
}

void menu(int list[])
{
  int i,l=0,li[1],j,cnt=0;
  char str[100]="",flag='t',f='t';
  printf(">>");
  gets(str);
  if(strcmp(str,"quit")==0)
    exit(EXIT_SUCCESS);
  if(strcmp(str,c)==0)
  {
    print(list);
    menu(list);
  }
  for(i=0;i<strlen(str);i++)
  {
    if(str[i]=='=')
    {
      f='f';
      len=check_len(str);
      find_val(str,len);
    }   
    else
      if((str[i]=='i')&&(str[i+1]=='n'))
      {
	for(j=0;j<strlen(c);j++)
	{
	  if(str[j+i+3]!=c[j])	    
	  {
	    flag='f';
	    puts("Variable NOT DECLARED!!!");
	    break;
	  }
	}
	if(flag=='t')
	{
	  f='f';
	  str[i-1]='\0';
	  get_list(li,str);
	  j=search(list,li[0]);
	  if(j==0)
	    printf("False\n");
	  else
	    printf("True\n");
	  menu(list);
	}
      }
    else
      if(str[i]=='.')
      {
	f='f';
        l=check_len(str);
	if(l==0)
	  other(list,str,1);
	else
          other(list,str,l);
      }
    else
      if(str[i]==':')
      {
	f='f';
	if(len==0)      
	{
	  printf("LIST NOT CREATED!!!\n");
	  menu(list);
	}
	//check_errors(list,str,'[',']');
	check_name(str,'[');
	cnt=0;
	for(j=0;j<strlen(str);j++)
	{
	  if(str[j]==':')
	  {
	    str[j]=',';
	    cnt++;
	    if(cnt>2)
	      err_message(list);
	  }  
	}
	get_list(li,str);
	if(cnt==2)
	  slicing(list,li[0],li[1],li[2]);
	else
	  slicing(list,li[0],li[1],1);
	menu(list);
      }
   
  } 
  if(f=='t')
  {
    printf("COMMAND NOT FOUND!!!\n");
    menu(list);
  }
}

void main()
{
  int list[1];
  menu(list);
}
